#include <sys_head.h>
#include "my_sqlite3.h"

// 回调函数
/*
azColName 表头 id user password age\
argv 数据
*/
int callback(void *data, int argc, char **argv, char **azColName)
{
    log_in_data * my_data = (log_in_data *)data;
    // for (int i = 0; i < argc; i++)
    // {
    //     printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    //     *((int *)data) = 1;
    // }
    my_data->id = atoi(argv[0]);
    strcpy(my_data->name, argv[1]);
    strcpy(my_data->password, argv[2]);
    my_data->age = atoi(argv[3]);

    //printf("\n");
    return 0;
}

sqlite3 * sqlite3_init_log_in(void)
{
    sqlite3 * my_sqlite3;
    char Tab_name[128] = "log_in";
    char sql_cmd[1024];

    // 报错
    char * sql_err_str;
    int sql_err_num;


    // 打开数据库
    sql_err_num = sqlite3_open("hqyj.db" , &my_sqlite3 );
    if (SQLITE_OK != sql_err_num)
    {
        printf("sqlite3_open : errnum:[%d] errstr:[%s]\n", sql_err_num, sqlite3_errmsg(my_sqlite3));
        exit(-1);
    }

    // 组装sql 语句  创建表
    sprintf(sql_cmd, "CREATE TABLE IF NOT EXISTS %s (id INTEGER PRIMARY KEY AUTOINCREMENT , User CHAR(64), password CHAR(64) , age INT)", Tab_name);

    // 执行sql 语句  创建表
    sqlite3_exec(my_sqlite3, sql_cmd, NULL, NULL, &sql_err_str);
    if (SQLITE_OK != sql_err_num)
    {
        printf("sqlite3_exec : errnum:[%d] errstr:[%s]\n", sql_err_num, sql_err_str);
        sqlite3_close(my_sqlite3);
        sqlite3_free(sql_err_str);
        exit(-1);
    }

    // 返回sql 句柄
    return my_sqlite3;

}


// 插入数据
void Insert_INTO_log_in(sqlite3 *sql)
{
    // 用户名
    char user[64];
    // 密码
    char password[64];
    // 年龄
    int age;

    // 数据库错误信息
    char * sql_err_str;

    // 报错代码
    int sql_err_num;

    // 数据库命令
    char sql_cmd[1024];

    char Tab_name[128] = "log_in";

    // 用户输入 插入的信息
    printf("请输入用户名:");
    scanf("%63s" , user);
    printf("请输入用户密码:");
    scanf("%63s" , password);
    printf("请输入用户年龄:");
    scanf("%d" , &age);

    // 组装sql 语句
    sprintf( sql_cmd ,  "INSERT INTO %s (User, password , age) VALUES ('%s' , '%s' , %d)" ,\
    Tab_name , user ,  password  , age);

    // 执行sql 语句
    sql_err_num = sqlite3_exec(sql , sql_cmd , NULL , NULL , &sql_err_str );
    if(SQLITE_OK != sql_err_num)
    {
        printf("插入错误 : errnum:[%d] errstr:[%s]\n", sql_err_num, sql_err_str );
        sqlite3_free(sql_err_str);
        return ;
    }

    printf("插入成功\n");

    return ;
}



// 删除数据
void Delete_FROM_log_in(sqlite3 *sql)
{
    // id
    int id;

    printf("请输入要删除的id:");
    scanf("%d" , &id);

    // 数据库错误信息
    char * sql_err_str;

    // 报错代码
    int sql_err_num;

    // 数据库命令
    char sql_cmd[1024];

    char Tab_name[128] = "log_in";

    // 组装命令
    sprintf(sql_cmd , "DELETE FROM %s WHERE id = %d;" , Tab_name , id);

    // 执行命令
    sql_err_num = sqlite3_exec(sql , sql_cmd , NULL , NULL , &sql_err_str);
    if (SQLITE_OK != sql_err_num)
    {
        printf("插入错误 : errnum:[%d] errstr:[%s]\n", sql_err_num, sql_err_str );
        sqlite3_free(sql_err_str);
        return ;
    }

    
    printf("删除成功\n");

    return ;


}



// 查找数据
log_in_data Select_FROM_log_in(sqlite3 *sql)
{
    // id
    int id;

    printf("请输入要查找的id:");
    scanf("%d" , &id);

    // 数据库错误信息
    char * sql_err_str;

    // 报错代码
    int sql_err_num;

    // 数据库命令
    char sql_cmd[1024];

    char Tab_name[128] = "log_in";

    // 组装数据
    log_in_data data;

    // 组装命令
    sprintf( sql_cmd , "SELECT * FROM %s WHERE id = %d;" , Tab_name , id);

    // 执行命令
    sql_err_num = sqlite3_exec(sql , sql_cmd , callback , &data , &sql_err_str);
    if (SQLITE_OK != sql_err_num)
    {
        printf("插入错误 : errnum:[%d] errstr:[%s]\n", sql_err_num, sql_err_str );
        sqlite3_free(sql_err_str);
        return data;
    }
    return data;
}

// 修改数据
void Updata_SET_log_in(sqlite3 *sql)
{
    // 用户名
    char user[64];
    // 密码
    char password[64];
    // 用户id
    int id;

    int age;
    // 数据库错误码
    int sql_err_num;
    // 数据库错误信息
    char *sql_err_str;
    // 数据库命令
    char sql_cmd[1024];

    char Tab_name[128] = "log_in";

    // 组装数据
    log_in_data data;

    // 输入用户id
    printf("请输入要修改的ID:");
    scanf("%d", &id);

    // 用户输入 修改的信息
    printf("请输入用户名:");
    scanf("%63s", user);

    printf("请输入用户密码:");
    scanf("%63s", password);

    printf("请输入用户年龄:");
    scanf("%d", &age);

    // 组装命令 UPDATE 表名 SET 字段名 = 新值 WHERE 条件;
    sprintf(sql_cmd,  "UPDATE %s SET User = '%s' , password = '%s' , age = %d WHERE id = %d",
             Tab_name, user  , password , age , id);

    // 执行命令 
    sql_err_num = sqlite3_exec(sql, sql_cmd, callback, &data, &sql_err_str);
    if (SQLITE_OK != sql_err_num)
    {
        printf("插入错误 : errnum:[%d] errstr:[%s]\n", sql_err_num, sql_err_str);
        sqlite3_free(sql_err_str);
        return;
    }

    printf("修改成功\n");
    return;
}
